/*
 * Copyright (C) 2012 POAS.VSTU
 */

package model;

import java.util.ArrayList;


/**
 * Карты на руках игрока
 */
public class PlayerCardPile extends CardPile {

    /**
     * Достает из стопки четверку карт одинакового ранга.
     * @return список из 4-х карт или пустой список, если четверок нет.
     */
    ArrayList<Card> popTetrad() {

        ArrayList<Card> tetrad = new ArrayList();
        if (сontainsTetrad()){
            for(int i = mCards.size() - 1; i > 2; i--){
                if(mCards.get(i).getFace() == mCards.get(i - 3).getFace()){
                    tetrad.add(mCards.get(i - 3));
                    tetrad.add(mCards.get(i - 2));
                    tetrad.add(mCards.get(i - 1));
                    tetrad.add(mCards.get(i));
                    mCards.remove(i);
                    mCards.remove(i - 1);
                    mCards.remove(i - 2);
                    mCards.remove(i - 3);
                    i = 2;
                }
            }
        }


       return tetrad;
    }

    /** Определяет наличие четверки карт одного ранга */
    boolean сontainsTetrad(){

        for(int i = 0; i < mCards.size() - 3; i++){
            if(mCards.get(i).getFace() == mCards.get(i + 3).getFace()){
                return true;
            }
        }
        return false;
    }

     /** Определяет индекс карты в стопке
      * @return индекс карты в стопке
      */
    @Override
    protected int getIndexByOrder(Card card){
        int index = 0;
        for (Card tmpCard : mCards) {
            if(compare(tmpCard, card) == -1){
                index++;
            }
        }

        return index;
    }

    /**
     * Сравнивает пару карт
     * @return 0, если карты идентичны, -1, если firstCard меньше secondCard, 1, если firstCard больше secondCard
     */
    public int compare(Card firstCard,Card secondCard) {

        int firstValue = getNumeralEquivalent(firstCard);
        int secondValue = getNumeralEquivalent(secondCard);
        if(firstValue > secondValue){
            return 1;
        }
        if(firstValue < secondValue){
            return -1;
        }
        return 0;
    }
    
    /**  Вспомогательная функция для получения порядкового номера карты в стопке для сортировок */
    public int getNumeralEquivalent(Card card){

        int result = 0;

        switch( card.getFace() ) {

            case SIX: 
                result += 10;
                break;
            case SEVEN: 
                result += 20;
                break;
            case EIGHT: 
                result += 30;
                break;
            case NINE: 
                result += 40;
                break;
            case TEN: 
                result += 50;
                break;
            case JACK: 
                result +=60;
                break;
            case QUEEN: 
                result += 70;
                break;
            case KING: 
                result += 80;
                break;
            case ACE: 
                result += 90;
                break;
        }

        switch (card.getSuit()) {

            case HEARTS: 
                result += 1;
                break;
            case CLUBS: 
                result += 2;
                break;
            case DIAMONDS: 
                result += 3;
                break;
            case SPADES: 
                result += 4;
                break;
        }

        return result;
    }

}